#include "Data.h"

// Constrói uma nova entrada/saída passado a quantidade de cada variável e um vetor de tokens
Data::Data(uint nInVars, uint nOutVars, vdouble& io, int filetype) :
        input(nInVars), output(nOutVars), neuralOutput(nOutVars)
{
    // Garante que a quantidade de tokens é a mesma que a soma das variáveis
    if(filetype == INPUT)
        assert(io.size() == (nInVars+nOutVars));
    else
        assert(io.size() == (nInVars+2*nOutVars));

    // Input
    for(uint i = 0; i < nInVars; i++)
        input.push_back(io.get(i));

    // Output
    for(uint i = 0; i < nOutVars; i++)
        output.push_back(io.get(i + nInVars));

    if(filetype == OUTPUT)
    {
        // Neural Output
        for(uint i = 0; i < nOutVars; i++)
            neuralOutput.push_back(io.get(i + nInVars + nOutVars));
    }
}

Data::~Data()
{
}

// Retorna o vetor de entradas
vdouble& Data::getInputVector()
{
    return input;
}

// Retorna o vetor de saídas
vdouble& Data::getOutputVector()
{
    return output;
}

// Retorna o vetor de saídas da rede neural
vdouble& Data::getNeuralOutputVector()
{
    return neuralOutput;
}

// Seta o valor de saída i da rede neural
void Data::setNeuralOutput(uint i, double out)
{
    neuralOutput.set(i, out);
}

// Verifica se o cálculo da rede neural foi bem sucedido para esta entrada/saída
bool Data::hasSucceeded()
{
    for(uint i = 0; i < output.size(); i++)
    {
        double diff = output.get(i) - neuralOutput.get(i);
        if(fabs(diff) >= DELTA)
            return false;
    }
    return true;
}

// Imprime as entradas
void Data::printInput()
{
    for(uint i = 0; i < input.size(); i++)
        cout << input.get(i) << " ";
}

// Imprime as saídas
void Data::printOutput()
{
    for(uint i = 0; i < output.size(); i++)
        cout << output.get(i) << " ";
}

// Imprime as saídas da rede neural
void Data::printNeuralOutput()
{
    for(uint i = 0; i < neuralOutput.size(); i++)
        cout << neuralOutput.get(i) << " ";
}

